package com.me.study.importBeanDefinitionRegistrar;

import com.me.study.config.MyPropertiesConfig;
import com.me.study.simpleMapperScan.MyMapperScan;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.GenericBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.annotation.AnnotationAttributes;
import org.springframework.core.type.AnnotationMetadata;

/**
 * spring ImportBeanDefinitionRegistrar： 手动注册 bean定义（注册器本身不会被注册为 Spring Bean）。	<p>
 * 需要配合如下配置才能生效：@Import({ TestImportBeanDefinitionRegistrar.class })	<p>
 * 此处见 {@link MyMapperScan MyMapperScan}	<p></p>
 *
 * @author ME
 * @date   2019/12/29
 */
public class TestImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

	@Override
	public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
		// importingClassMetadata 表示导入自己的 @Import注解 所在的类的 注解元数据，如：
		// 		@MyMapperScan 注解导入了自己，又因为 @MyMapperScan 本身也是注解，此处获取的是
		// 		配置 @MyMapperScan 的类（AppConfig） 的所有注解信息 @Configuration、@ComponentScan、@MyMapperScan、@EnableSelector、@Import
		AnnotationAttributes mapperScanAttrs = AnnotationAttributes
				.fromMap(importingClassMetadata.getAnnotationAttributes(MyMapperScan.class.getName()));
		if (mapperScanAttrs != null) {
			System.out.println("@MyMapperScan 配置了要扫描的包路径：" + mapperScanAttrs.getStringArray("basePackages")[0]);
		}

		// 1，基于指定 class对象 生成 bean定义
	 	// 2，把 bean定义 注册到 bean工厂中
		BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(MyPropertiesConfig.class);
		GenericBeanDefinition beanDefinition = (GenericBeanDefinition) builder.getBeanDefinition();
		registry.registerBeanDefinition("myPropertiesConfig", beanDefinition);
		System.out.println("【Spring】 ImportBeanDefinitionRegistrar: 使用 TestImportBeanDefinitionRegistrar 注册 MyPropertiesConfig");
	}
}
